#ifndef FTPCLIENT_H
#define FTPCLIENT_H

#include <QFuture>
#include <QObject>
#include <QString>
#include <curl.h>
#include <qfile.h>

class FTPClient : public QObject
{
    Q_OBJECT
public:
    explicit FTPClient(QObject *parent = nullptr);
    ~FTPClient();

    // 初始化（必须调用）
    bool init();

    // 新增：文件上传异步方法
    QFuture<bool> uploadFileAsync(const QString& ftpUrl, const QString& username,
        const QString& password, const QString& localFile,
        const QString& remoteFile);


    // 核心功能：下载单个文件（返回 QFuture<bool> 用于异步）
    QFuture<bool> downloadFileAsync(
        const QString& ftpUrl,    // 如 "ftp://your.server.com"
        const QString& username,  // FTP 用户名
        const QString& password,  // FTP 密码
        const QString& remoteFile,// 远程文件路径（如 "/test.txt"）
        const QString& localFile  // 本地保存路径（如 "C:/downloads/test.txt"
    );
    // 新增：获取目录列表的异步方法
    QFuture<QStringList> getDirectoryListingAsync(const QString &ftpUrl,
                                                  const QString &username,
                                                  const QString &password,
                                                  const QString &remoteDir = "");

signals:
    // 下载进度反馈（文件名 + 进度0~100）
    void downloadProgress(const QString& fileName, int progress);

    void directoryListingReady(const QStringList& files);
    void directoryListingError(const QString& errorMessage);

    // 新增：上传进度信号
    void uploadProgress(const QString& fileName, int progress);
    void uploadFinished(const QString& fileName, bool success);
    void uploadError(const QString& fileName, const QString& errorMessage);
private:
    CURL* m_curl;
    bool m_initialized;
    int m_lastProgress;  

    QAtomicInt m_operationInProgress; // 0无操作，1:下载，2:上传
    CURL* createCurlHandle();

    static size_t writeCallback(void* contents, size_t size, size_t nmemb, void* userp);
    static int progressCallback(void* clientp, double dltotal, double dlnow, double ultotal, double ulnow);
    static size_t listCallback(void *contents,size_t size,size_t nmemb,void *userp);


    // 新增：上传回调函数
    static size_t uploadWriteCallback(void* contents, size_t size, size_t nmemb, void* userp);
    static int uploadProgressCallback(void* clientp, double dltotal, double dlnow,
        double ultotal, double ulnow);

    // 新增：上传数据结构
    struct UploadData {
        FTPClient* ftpClient;
        QString fileName;
        QFile* file;
        qint64 fileSize;
    };
    // 上传
    void manageUploadTask(QFuture<bool> future, const QString& fileName);
};


#define FTPClientRelease Singleton<FTPClient>::Release()
#define FTPClientInstance Singleton<FTPClient>::GetInstance()


#endif // FTPCLIENT_H
